home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 30
/
Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso
/
Aminet
/
misc
/
math
/
VintEval_src.lha
/
VintEval
/
Vint-evaluator.S
< prev
next >
Wrap
Text File
|
1996-12-06
|
29KB
|
1,733 lines
;--------------
;--------------
;-------------- © 1996 Maurice van Wanum
;-------------- VInt, a course in calculating with long numbers
;--------------
incdir ASM-ONE:
include Include.S ; macros, exec, dos & intuition
nederlands =1
; formaat :
; VInt = Lengte in woorden -1
; woorden...
rsreset
VI_Len rs.w 1
VI_Num rs.w 1
MOVAL macro
lea \2(PC),\3
move.l \1,(\3)
endm
debug =0
save =01
rsreset
TxtLen = 250
Txt rs.b 0
OutBuff rs.b 256
A rs.l 1
B rs.l 1
C rs.l 1
DosBase rs.l 1
InHD rs.l 1
OutHD rs.l 1
PrpHD rs.l 1
MySize rs.b 0
j move.l 4.w,a6 exec.lib
move.l #MySize,d0
move.l #$10001,d1
Lib AllocMem geheugen voor variabelen
move.l d0,a5
tst.l d0
beq.s .nomem
OpenLib DosNaam
move.l d0,DosBase(a5)
pea closedos(PC)
if save
auto wo\
sub.l a1,a1
Lib FindTask ; onze task zoeken
move.l d0,a4
tst.l $ac(a4)
bne.S CLIStart ; geen 0 -> vanuit CLI (of Shell)
; Workbench-Startup
lea $5c(a4),a0
Lib WaitPort
lea $5c(a4),a0
Lib GetMsg
move.l d0,-(SP)
move.l DosBase(a5),a6
lea _CON(PC),a0
move.l a0,d1
move.l #MODE_OLDFILE,d2
Lib Open
lea InHD(a5),a0
move.l d0,(a0)+
beq.s .nocon
bsr.s WBStart
.nocon move.l DosBase(a5),a6
move.l InHD(a5),d1
Lib Close
move.l (SP)+,a1
move.l 4.w,a6
LibJ ReplyMsg
else
bra.s CLIStart
endif
.nomem moveq #103,d0
rts
CLIStart
; begin van programma
move.l DosBase(a5),a6
if debug
lea _CON(PC),a0
move.l a0,d1
move.l #MODE_OLDFILE,d2
Lib Open
else
Lib Input
endif
lea InHD(a5),a0
move.l d0,(a0)+
if debug=0
Lib Output
endif
WBStart lea OutHD(a5),a0
move.l d0,(a0)+
move.l d0,(a0)+
beq.b Exit
bsr.w evalueer
klaar move.l A(a5),d0
beq.b .xB
move.l d0,a1
bsr.w FreeVInt
.xB move.l B(a5),d0
beq.b .xC
move.l d0,a1
bsr.w FreeVInt
.xC move.l C(a5),d0
beq.b .ex
move.l d0,a1
bsr.w FreeVInt
.ex lea OutBuff(a5),a0
move.l InHD(a5),d1
move.l a0,d2
moveq #1,d3
move.l DosBase(a5),a6
Lib Read
if debug
move.l InHD(a5),d1
Lib Close
endif
Exit rts
closedos
move.l DosBase(a5),a1
move.l 4.w,a6
Lib CloseLibrary
move.l a5,a1
move.l #MySize,d0
Lib FreeMem
moveq #0,d0
rts
GetKey lea OutBuff(a5),a0
move.l InHD(a5),d1
move.l a0,d2
moveq #1,d3
move.l DosBase(a5),a6
Lib Read
tst.l d0
beq.b .ex
move.b OutBuff(a5),d0
.ex rts
Getfile lea OutBuff+2(a5),a2
.get bsr.b GetKey
cmp.b #10,d0
beq.b .ok
move.b d0,(a2)+
bra.b .get
.ok clr.b (a2)
lea OutBuff+2(a5),a0
rts
evalueer
moveq #0,d4 ; 0 elementen op de stack
lea _Prompt(PC),a0
move.l DosBase(a5),a6
move.l a0,d2
move.l PrpHD(a5),d1
moveq #3,d3
Lib Write
evloop bsr.b GetKey
evret tst.b d0 ; iets ging fout
beq.w .exit
cmp.b #'9',d0
bhi.b .1
cmp.b #'0',d0
bhs.w HaalNum
.1 lea .ktab(PC),a0
lea .jtab(PC),a1
moveq #[.kend-.ktab],d1
bra.w KeyDecode
.ktab dc.b 10,'?mxabc+-*/%=!^ ;<>'
.kend
even
.jtab dr.w .freestack,help,.mem,.exit
dr.w .puA,.puB,.puC
dr.w evAdd,evSub
dr.w evMaal,evDeel,evMod
dr.w evIS,evFac,evPower
dr.w evloop,.eval,Input,Output
dr.w .ong
.eval addq #1,d4
.ev subq #1,d4
beq.b evloop
pop.w d0
pop.l a1
bne.b .ev ; variabele => niet vrijgeven
bsr.w FreeVInt ; geef geheugen terug
bra.b .ev
.ong lea _ong(PC),a0
bsr.w PrintTxt
.ong1 bsr.w GetKey
cmp.b #10,d0
bne.b .ong1
; bra .freestack
.freestack
tst d4
beq.w evalueer
pop.w d0
beq.b .const ; 0=constante
pop.l a0 ; variabele => niet vrijgeven
move.l (a0),a0
bsr.w PrintVInt ; printen
lea _LF(PC),a0
bsr.w PrintTxt ; newline
.dump move.w d4,d0
subq #1,d0
beq.w evalueer
push.w d0
move.l SP,a1
lea _weg(PC),a0
bsr.w print
addq.l #2,SP
.fr subq #1,d4
beq.w evalueer
pop.w d0
pop.l a1
bne.b .fr ; variabele => niet vrijgeven
bsr.w FreeVInt ; geef geheugen terug
bra.b .fr
.const move.l (SP),a0
bsr.w PrintVInt
lea _LF(PC),a0
bsr.w PrintTxt
pop.l a1
bsr.w FreeVInt ; geef geheugen terug
bra.b .dump
.puA pea A(a5)
.pu push.w #10 ; variabele <> 0
addq #1,d4
bra.w evloop
.puB pea B(a5)
bra.b .pu
.puC pea C(a5)
bra.b .pu
.exit tst d4
bne.w evloop
.ex rts
.mem bsr.w Memory
bra.w evloop
Input tst.w d4
bne.w ErrMsg
bsr.w Getfile
move.l a0,d1
move.l #MODE_OLDFILE,d2
Lib Open
tst.l d0
beq.s IOerr
lea InHD(a5),a0
push.l (a0)
move.l d0,(a0)
pea CloseIn(PC)
move.l d0,d1
Lib IsInteractive
tst.l d0
beq.s .noterm ; input is niet interactive => output gebruiken
move.l InHD(a5),PrpHD(a5) ; input voor prompt weergave
bra.w evalueer
.noterm move.l OutHD(a5),PrpHD(a5)
bra.w evalueer
IOerr lea _IOerr(PC),a0
bsr.w PrintTxt
bra.w evalueer
Output tst.w d4
bne.w ErrMsg
bsr.w Getfile
move.l a0,d1
move.l #MODE_NEWFILE,d2
Lib Open
tst.l d0
beq.s IOerr
lea OutHD(a5),a0
push.l (a0)
move.l d0,(a0)
pea CloseOut(PC)
move.l InHD(a5),d1
Lib IsInteractive
tst.l d0
bne.w evalueer ; input is interactive => prompt-handler ok
move.l OutHD(a5),PrpHD(a5)
bra.w evalueer
CloseIn move.l DosBase(a5),a6
move.l InHD(a5),d1
Lib Close
pop.l d1
move.l d1,InHD(a5)
move.l d1,PrpHD(a5)
Lib IsInteractive
tst.l d0
bne.w evloop
move.l OutHD(a5),PrpHD(a5)
bra.w evloop
CloseOut
move.l DosBase(a5),a6
move.l OutHD(a5),d1
Lib Close
pop.l d1
move.l d1,OutHD(a5)
move.l d1,PrpHD(a5)
move.l InHD(a5),d1
Lib IsInteractive
tst.l d0
beq.w evloop
move.l InHD(a5),PrpHD(a5)
bra.w evloop
HaalNum and.w #$f,d0
bsr.w Word2VInt
push.l d0
beq.b .err
.get bsr.w GetKey
tst.b d0
beq.b .klaar ; fout
cmp.b #10,d0
beq.b .klaar ; LF
cmp.b #'9',d0
bhi.b .klaar ; geen cijfer
cmp.b #'0',d0
blo.b .klaar ; geen cijfer
and.w #$f,d0
bsr.w Word2VInt
push.l d0
beq.b .err
lea tien(PC),a0
move.l 4(SP),a1
bsr.w MulVInt
tst.l d0
beq.b .err2
move.l 4(SP),a1
move.l d0,4(SP)
bsr.w FreeVInt
move.l 4(SP),a0
move.l (SP),a1
bsr.w AddVInt
tst.l d0
beq.b .err2
move.l d0,a2
pop.l a1
bsr.w FreeVInt
pop.l a1
bsr.w FreeVInt
push.l a2
bra.b .get
.klaar clr.w -(SP) ; constante
addq #1,d4
bra.w evret
.err2 pop.l a1 ; geef cijfer terug
bsr.w FreeVInt
pop.l a1
bsr.w FreeVInt ; geef getal terug
bra.b ErrMsg ; print error
.err addq.l #4,SP
; bra ErrMSg
ErrMsg lea _error(PC),a0
bsr.w PrintTxt
bra.w evloop
help lea _help(PC),a0
bsr.w PrintTxt
bra.w evloop
evAdd lea AddVInt(PC),a2
bra.w evAlg
evSub lea SubVInt(PC),a2
bra.w evAlg
evMaal lea MulVInt(PC),a2
bra.w evAlg
evDeel lea DeelVInts(PC),a2
bra.w evAlg
evMod cmp.b #2,d4
blo.w evloop ; minder dan twee argumenten
moveq #0,d2
pop.w d1
pop.l a1 argument 1
pop.w d0
pop.l a0 argument 2
tst.w d0
bne.b .1
push.l a0
addq #1,d2
bra.b .1a
.1 move.l (a0),a0
.1a tst.w d1
bne.b .2
push.l a1
addq #1,d2
bra.b .2a
.2 move.l (a1),a1
.2a bsr DeelVIntsMod bepaal quotient + modulo
move.l d1,d3
move.l d0,a1
bsr FreeVInt geef quotient vrij
.4 subq #1,d2
bcs.b .3
pop.l a1
bsr.w FreeVInt geef argument vrij
bra.b .4
.3 tst.l d3
beq.b .err
push.l d3 sla modulo op
clr.w -(SP)
subq #1,d4
bra.w evloop ga verder
.err subq #2,d4
bra.w ErrMsg
evPower lea PowerVInt(PC),a2
bra.w evAlg
evIS cmp.b #2,d4
blo.w evloop ; minder dan twee argumenten
tst.w (SP)
beq.b .ongel ; geen variabele als tweede argument
addq.l #2,SP
subq #1,d4
move.l (SP),a1
move.l (a1),a1
bsr.w FreeVInt
pop.l a1
pop.w d0
pop.l a0
beq.b .ok
move.l (a0),a0
push.l a1
bsr.w CopyVInt
pop.l a1
move.l d0,a0
tst.l d0
beq.b .err
.ok move.l a0,(a1)
push.l a1
push.w #10
bra.w evloop
.err subq #1,d4
bra.w ErrMsg
.ongel lea _ong(PC),a0
bsr.w PrintTxt
bra.w evloop
evFac cmp.b #1,d4
blo.w evloop
moveq #0,d2
pop.w d0
pop.l a1
beq.b .ok
move.l (a1),a1
bra.b .ok2
.ok moveq #1,d2
.ok2 subq #1,d4
tst.w (a1)
bne.b .err
push.w 2(a1)
tst.w d2
beq.b .1
bsr.w FreeVInt
.1 pop.w d0
bsr.b Fac
tst.l d0
beq.w ErrMsg
addq #1,d4
push.l d0
clr.w -(SP)
bra.w evloop
.err tst.w d2
beq.w ErrMsg
bsr.w FreeVInt
bra.w evloop
evAlg cmp.b #2,d4
blo.w evloop ; minder dan twee argumenten
moveq #0,d2
pop.w d1
pop.l a1
pop.w d0
pop.l a0
tst.w d0
bne.b .1
push.l a0
addq #1,d2
bra.b .1a
.1 move.l (a0),a0
.1a tst.w d1
bne.b .2
push.l a1
addq #1,d2
bra.b .2a
.2 move.l (a1),a1
.2a jsr (a2)
move.l d0,d3
.4 subq #1,d2
bcs.b .3
pop.l a1
bsr.w FreeVInt
bra.b .4
.3 tst.l d3
beq.b .err
push.l d3
clr.w -(SP)
subq #1,d4
bra.w evloop
.err subq #2,d4
bra.w ErrMsg
;===== in : d0 = int van de te berekenen faculteit
;===== uit : d0 = VInt
Fac tst.w d0
beq.b .een
movem.l d2/d3/a2,-(SP)
moveq #0,d2
move.w d0,d2
moveq #1,d0
bsr.w Word2VInt
move.l d0,a2
tst.l d0
beq.b .err
moveq #2,d3
.lus cmp d2,d3
bhi.s .klaar
move.l d3,-(SP)
move.l SP,a0
move.l a2,a1
bsr MulVInt
addq #4,SP
tst.l d0
beq.b .free
move.l a2,a1
move.l d0,a2
bsr FreeVInt
addq #1,d3
bra.b .lus
.klaar move.l a2,d0
movem.l (SP)+,d2/d3/a2
rts
.free move.l a2,a1
bsr.w FreeVInt
.err moveq #0,d0
rts
.een moveq #1,d0
bra.w Word2VInt
; in a0=VInt1
; a1=VInt2
; uit d0=nieuw VInt
; A + B -> C
AddVInt movem.l d2/d3/a2/a3,-(SP)
move.w (a1),d0
cmp.w (a0),d0
bmi.s .1
exg a0,a1 ; a0=grootste int
.1 moveq #0,d0
moveq #0,d1
move.w (a0),d0 ; aantal woorden langste
move.w (a1),d1 ; aantal woorden kortste
move.w d0,d2
move.w d1,d3
add.l d0,d0
add.l d1,d1
lea 4(a0,d0.l),a2 ; einde van langste
lea 4(a1,d1.l),a3 ; einde van kortste
move.w d2,d0
bsr.w MaakVInt ; grootste kopieeren
tst.l d0
beq.b .ex ; mislukt
move.l d0,a0
moveq #0,d0
move.w d2,d0
add.l d0,d0
lea 4(a0,d0.l),a1 ; einde van de nieuwe
sub.w d3,d2 ; verschil tussen langste en kortste
asr.w #1,d3
dc.w $023c,1 ; foutje in de assembler
; andi.b #1,CCR ; de eigenlijke opcode
bcs.b .lusin ; X-bit is nu nooit gezet
move.w -(a2),d0
move.w -(a3),d1
add.w d1,d0
dbf d3,.lusk
dbf d2,.ok
bcs.s .ovf ; getal is te lang => langer maken
move.w d0,-(a1)
bra.b .end
.lusk move.w d0,-(a1)
bra.b .lusin
.lus move.l d0,-(a1)
.lusin move.l -(a2),d0
move.l -(a3),d1
addx.l d1,d0
dbf d3,.lus
dbf d2,.ok2
bcc.b .klaar ; geen overflow => we zijn klaar met optellen
move.l d0,-(a1)
bra.b .ovfl ; overflow
.ok2 move.l d0,-(a1)
moveq #0,d1
bra.b .ext2
.ok moveq #0,d1
.ext move.w d0,-(a1)
.ext2 move.w -(a2),d0
addx.w d1,d0
dbf d2,.ext
bcs.b .ovf ; overflow
.ends move.w d0,-(a1)
bra.b .end
.klaar move.l d0,-(a1)
.end move.l a0,d0 ; keer terug
.ex movem.l (SP)+,d2/d3/a2/a3
rts
.ovf move.w d0,-(a1)
.ovfl bsr.w ExtendVInt
bra.b .ex
; in a0=VInt1
; a1=VInt2
; uit d0=nieuw VInt
; A - B -> C
SubVInt movem.l d2/d3/a2/a3,-(SP)
move.w (a1),d0
cmp.w (a0),d0
bhi.w .err ; a1 > a0 => negatief antwoord
; a0=grootste int
.1 moveq #0,d0
moveq #0,d1
move.w (a0),d0 ; aantal woorden langste
move.w (a1),d1 ; aantal woorden kortste
move.w d0,d2
move.w d1,d3
add.l d0,d0
add.l d1,d1
lea 4(a0,d0.l),a2 ; einde van langste
lea 4(a1,d1.l),a3 ; einde van kortste
move.w d2,d0
bsr.w MaakVInt ; grootste kopieeren
tst.l d0
beq.b .ex ; mislukt
move.l d0,a0
moveq #0,d0
move.w d2,d0
add.l d0,d0
lea 4(a0,d0.l),a1 ; einde van de nieuwe
sub.w d3,d2 ; verschil tussen langste en kortste
asr.w #1,d3
dc.w $023c,1 ; foutje in de assembler
; andi.b #1,CCR ; de eigenlijke opcode
bcs.b .lusin ; X-bit is nu nooit gezet
move.w -(a2),d0
move.w -(a3),d1
sub.w d1,d0
dbf d3,.lusk
dbf d2,.ok
bcs.s .ovf ; overflow
move.w d0,-(a1)
bra.b .end
.lusk move.w d0,-(a1)
bra.b .lusin
.lus move.l d0,-(a1)
.lusin move.l -(a2),d0
move.l -(a3),d1
subx.l d1,d0
dbf d3,.lus
dbf d2,.ok2
bcc.b .klaar ; geen overflow => we zijn klaar met optellen
bra.b .ovf ; overflow
.ok2 move.l d0,-(a1)
moveq #0,d1
bra.b .ext2
.ok moveq #0,d1
.ext move.w d0,-(a1)
.ext2 move.w -(a2),d0
subx.w d1,d0
dbf d2,.ext
bcs.b .ovf ; overflow
.ends move.w d0,-(a1)
bra.b .end
.klaar move.l d0,-(a1)
.end bsr.w ShrinkVInt ; keer terug
.ex movem.l (SP)+,d2/d3/a2/a3
rts
.err moveq #0,d0
bra.b .ex
.ovf move.l a0,a1
bsr.w FreeVInt
bra.b .err
; in a0 = VInt1
; a1 = VInt2
; uit d0 = nieuw VInt
; A * B -> C
MulVInt movem.l d2-d4/a2/a3,-(SP)
moveq #0,d0
moveq #0,d1
move.w (a0),d0 ; aantal woorden int1
move.w (a1),d1 ; aantal woorden int2
move.w d0,d2
move.w d1,d3
add.l d0,d0
add.l d1,d1
lea 4(a0,d0.l),a2 ; einde van int1
lea 4(a1,d1.l),a3 ; einde van int2
move.w d2,d0
add.w d3,d0
bcs.b .ex ; overflow
addq #1,d0
bcs.b .ex ; overflow
bsr.w MaakVInt ; grootste kopieeren
tst.l d0
beq.b .ex ; mislukt
move.l d0,a0
moveq #0,d0
move.w (a0),d0
add.l d0,d0
lea 4(a0,d0.l),a1 ; einde van de nieuwe
.lus1 push.w d2
move.w #0,CCR
move.w -(a3),d0
.lus move.w -(a2),d1
mulu d0,d1
add.l d1,-(a1)
bcc.s .l1
moveq #0,d1
.l2 addq #4,d1
addq.l #1,-(a1)
bcs.s .l2
add.l d1,A1
.l1 addq #2,a1
dbf d2,.lus
pop.w d2
moveq #0,d0
move.w d2,d0
add.l d0,d0
lea 2(a2,d0.l),a2
add.l d0,a1
dbf d3,.lus1
bsr.w ShrinkVInt
.ex movem.l (SP)+,d2-d4/a2/a3
rts
; in a0 = VInt
; d0 = Deler (int)
; uit d0 = nieuw VInt
; d1 = Modulo.w
; A / B -> C
DeelVInt
movem.l d2/a2/a3,-(SP)
move.l d0,d2
move.w (a0)+,d0
move.l a0,a2
bsr.w MaakVInt
tst.l d0
beq.b .ex ; mislukt
move.l d0,a1
move.l d0,a0
move.w (a1)+,d0
moveq #0,d1
.lus move.w (a2)+,d1
divu d2,d1
move.w d1,(a1)+
dbf d0,.lus
swap d1
push.w d1
bsr.w ShrinkVInt
moveq #0,d1
pop.w d1
.ex movem.l (SP)+,d2/a2/a3
rts
; in a0 = VInt1 (A)
; a1 = VInt2 (B)
; uit d0 = nieuw VInt (C)
; A / B -> C
DeelVInts
tst.w (a1)
beq.s .1
bsr.b DeelVIntsIt
push.l d0
move.l d1,a1
bsr.w FreeVInt
pop.l d0
rts
.1 move.w 2(a1),d0
bra.b DeelVInt
; in a0 = VInt1 (A)
; a1 = VInt2 (B)
; uit d0 = nieuw VInt (C)
; uit d1 = modulo VInt (D)
; A / B -> C r D
DeelVIntsMod
tst.w (a1)
beq.s .1
bsr.b DeelVIntsIt
push.l d0
move.l d1,a0
bsr.w ShrinkVInt
move.l d0,d1
pop.l d0
rts
.1 move.w 2(a1),d0
bsr.b DeelVInt
push.l d0
move.w d1,d0
bsr.w Word2VInt
move.l d0,d1
pop.l d0
rts
; in a0 = VInt1 (A)
; a1 = VInt2 (B)
; uit d0 = nieuw VInt (C)
; uit d1 = modulo VInt (D)
; A / B -> C r D
DeelVIntsIt
movem.l d2-d4/a2-a4,-(SP)
move.l a0,a2 ; langste (grootste)
move.l a1,a3 ; kortste (kleinste)
move.w (a1)+,d1
move.w (a0)+,d0
cmp.w d1,d0
blo.w .null ; A < B => A/B=0
bne.b .ok
.1 cmpm.w (a0)+,(a1)+
dbne d0,.1
beq.w .een ; de 2 ints zijn gelijk => A/B=1
bhi.w .null ; A < B => A/B=0
move.w d1,d0
;=== maak antwoord VInt
.ok sub.w d1,d0
bsr.w MaakVInt
tst.l d0
beq.w .ex
push.l d0
move.l d0,a4
addq #2,a4
;=== kopieer langste, deze bevat uiteindelijk de modulo
move.l a2,a0
bsr.w CopyVInt
tst.l d0
beq.w .freeint
move.l d0,a2
;==== We gaan nu uitzoeken welke van de twee VInts de hoogste bit heeft
.lus
;=== a2 = copy van langste
;=== a3 = kortste
;=== a4 = antwoord
;=== (SP) = antwoord
moveq #15,d4
move.w 2(a2),d1
.2 btst d4,d1
dbne d4,.2 ; d4 = bitnummer hoogste gezette bit langste
moveq #15,d3
move.w 2(a3),d1
.5 btst d3,d1
dbne d3,.5 ; d3 = bitnummer hoogste gezette bit kortste
;==== Zet bit d4 min d3 in antwoord op 1
move.w d4,d1
sub.w d3,d1
blo.w .v1 ; negatief bitnummer -> kan niet
move.w d1,d3
;=== schuif kortste naar links
move.w d3,d0
beq.s .ns
move.l a3,a0
bsr.w ShiftVIntL
.ns
;=== zet bit in antwoord
.terug move.w (a4),d0
bset d3,d0
move.w d0,(a4)
;=== kijken of we kunnen aftrekken
move.w 2(a2),d0
cmp.w 2(a3),d0
bcs.b .foutv2 ; nee
;=== aftekken
moveq #0,d0
move.w (A3),d0
add.l d0,d0
lea 4(a3,d0.l),a0
lea 4(a2,d0.l),a1
lsr.l #1,d0
.3 subx.w -(a0),-(a1)
dbf d0,.3
bcs.b .foutje2 ; foutje, aftrekken kon toch niet
.check
subq #1,d3
bcs.b .verder ; hier zijn we klaar
;=== verschuif kortste 1 naar rechts
moveq #1,d0
move.l a3,a0
bsr.w ShiftVIntR
bra.b .terug
.foutje2 ; we herstellen de vorige toestand
moveq #0,d0
move.w (a3),d0
add.l d0,d0
lea 4(a3,d0.l),a0
lea 4(a2,d0.l),a1
lsr.l #1,d0
.v5 addx.w -(a0),-(a1)
dbf d0,.v5
.foutv2
move.w (a4),d1
bclr d3,d1
move.w d1,(a4)
bra.b .check
.klaar pop.l a0
bsr.w ShrinkVInt
move.l a2,d1
.ex movem.l (SP)+,d2-d4/a2-a4
rts
;====== De rest van de deling
.verder move.l a2,a0
move.l a3,a1
move.w (a0)+,d0
move.w (a1)+,d1
cmp.w d0,d1
bhi.b .klaar ; A < B => A/B=0
bne.b .ver2 ;ok
.v2 cmpm.w (a0)+,(a1)+
dbne d0,.v2
bhi.b .klaar ; A < B => A/B=0
.ver2 move.w d3,d1
;=== zet de bit in het antwoord
.v1 moveq #0,d2
move.w d1,d2
add.w #16,d1
addq.l #2,a4
move.w (a4),d0
bset d1,d0
move.w d0,(a4)
;=== verschuif de langste naar links
neg.w d2
move.w d1,d3
move.w d2,d0
move.l a2,a0
bsr.w ShiftVIntL
;=== kijken of we kunnen aftrekken
.tmin move.w 2(a2),d0
cmp.w 2(a3),d0
bcs.w .foutv ; nee
;=== aftrekken
moveq #0,d0
move.w (A3),d0
add.l d0,d0
lea 4(a3,d0.l),a0
lea 4(a2,d0.l),a1
lsr.l #2,d0
bcs.s .v32
subx.w -(A0),-(a1)
dbf d0,.v3
bra.b .v31
.v32 move #0,CCR
.v3 subx.l -(a0),-(a1)
dbf d0,.v3
.v31 bcs.b .foutje ; aftrekken kon toch niet
.ovfret subq #1,d3
bcs.b .checkm
;=== zet bit
.ok3 move.w (a4),d1
bset d3,d1
move.w d1,(a4)
;=== verschuif de langste 1 naar links
moveq #1,d0
move.l a2,a0
bsr.w ShiftVIntL
moveq #0,d0
roxl.w #1,d0
beq.b .tmin
bra.b .ovf ; overflow
.checkm addq.l #2,a4
add.w #16,d3
move.l a2,a0
bsr.w CutOff
move.l a2,a0
move.l a3,a1
move.w (a0)+,d0
move.w (a1)+,d1
cmp.w d0,d1
bhi.w .klaar ; A < B => A/B=0
bne.b .ok3 ;ok
.1m cmpm.w (a0)+,(a1)+
dbne d0,.1m
bhi.w .klaar ; A < B => A/B=0
bra.b .ok3 ; ok
.foutje moveq #0,d0
move.w (a3),d0
add.l d0,d0
lea 4(a3,d0.l),a0
lea 4(a2,d0.l),a1
lsr.l #2,d0
bcs.b .v41
addx.w -(A0),-(a1)
dbf d0,.v4
bra.b .foutv
.v41 move #0,CCR
.v4 addx.l -(a0),-(a1)
dbf d0,.v4
.foutv
move.w (a4),d0
bclr d3,d0
move.w d0,(a4)
subq #1,d3
bcs.b .checkm
;=== zet bit
move.w (a4),d1
bset d3,d1
move.w d1,(a4)
;=== schuif langste 1 naar links
moveq #1,d0
move.l a2,a0
bsr.b ShiftVIntL
moveq #0,d0
roxl.w #1,d0
beq.w .tmin
; bra .ovf ; overflow
;=== aftrekken, aftrekken kan nu altijd
.ovf moveq #0,d0
move.w (A3),d0
add.l d0,d0
lea 4(a3,d0.l),a0
lea 4(a2,d0.l),a1
lsr.l #1,d0
.ov3 subx.w -(a0),-(a1)
dbf d0,.ov3
bra.w .ovfret
;====== geef een 1 mod 0 terug als antwoord
.een moveq #0,d0
bsr.w Word2VInt
push.l d0
moveq #1,d0
bsr.w Word2VInt
pop.l d1
bra.w .ex
;====== geef een 0 terug als antwoord
.null move.l a2,a0
bsr.w CopyVInt
push.l d0
moveq #0,d0
bsr.w Word2VInt
pop.l d1
bra.w .ex
.freeint
move.l (SP)+,a1
bsr.w FreeVInt ; geef int vrij
moveq #0,d0 ; fout-waarde
bra.w .ex
; in a0 = te verschuiven VInt
; d0 = aantal bits naar links
; uit d0 = VInt
ShiftVIntL
push.l a0
moveq #0,d1
move.w (a0)+,d1
cmp.w #1,d0
beq.b .Shift1 ; maar een bit
;===== 2 bits of meer (max. 16)
lea 2(a0,d1.l),a0
add.l d1,a0
movem.l d2/d3,-(SP)
moveq #0,d3
.2 moveq #0,d2
move.w -(a0),d2
lsl.l d0,d2
or.w d3,d2
move.w d2,(a0)
swap d2
move.w d2,d3
dbf d1,.2
movem.l (SP)+,d2/d3
pop.l d0
rts
;===== 1 bit
.Shift1
; move.w d1,d0
; add.l d1,d1
; lea 2(a0,d1.l),a0
;.4 roxl -(a0)
; dbf d0,.4
; pop.l d0
; rts
move.w d1,d0
add.l d1,d1
lea 2(a0,d1.l),a0
move.l a0,a1
lsr.w #1,d0
bcs.s .3
addx.w -(a0),-(a1)
dbf d0,.1
pop.l d0
rts
.3 move #0,CCR
.1 addx.l -(A0),-(a1)
dbf d0,.1
pop.l d0
rts
; in a0 = te verschuiven VInt
; d0 = aantal bits naar rechts
; uit d0 = VInt
ShiftVIntR
push.l a0
moveq #0,d1
move.w (a0)+,d1
cmp.w #1,d0
beq.b .Shift1 ; maar 1 bit
;===== 2 bits of meer (max. 16)
movem.l d2/d3,-(SP)
moveq #0,d3
.2 moveq #0,d2
move.w (a0),d2
ror.l d0,d2
or.w d3,d2
move.w d2,(a0)+
swap d2
move.w d2,d3
dbf d1,.2
movem.l (SP)+,d2/d3
pop.l d0
rts
;===== 1 bit
.Shift1 move #0,CCR
.1 roxr.w (A0)+
dbf d1,.1
pop.l d0
rts
; in a0 = grondtal
; a1 = exponent
; uit d0 = resultaat
PowerVInt
movem.l d2/d3/a2-a4,-(SP)
moveq #1,d0
move.l a0,a2 ; a2 = grondtal
move.l a1,a3 ; a3 = exponent
bsr.w Word2VInt
move.l d0,a4 ; resultaat
tst.l d0
beq.w .ex ; da's snel
move.l a3,a0
bsr.w CopyVInt ; copy van exponent
move.l d0,a3
tst.l d0
beq.w .freeres ; helaas
move.l a2,a0
bsr.w CopyVInt ; copy van grondtal
move.l d0,a2
tst.l d0
beq.w .freeres2 ; helaas
.lus tst.l (a3)
beq.b .klaar ; klaar !!!
moveq #0,d0
move.w (a3),d0
add.l d0,d0
lea 3(a3,d0.l),a0
btst.b #0,(a0)
beq.b .kwad
;=== r*a^b = a*r*a^(b-1)
move.l a4,a0
move.l a2,a1
bsr.w MulVInt
tst.l d0
beq.b .freeres3 ; helaas
move.l a4,a1
move.l d0,a4
bsr.w FreeVInt
pea 1.w
move.l SP,a1
move.l a3,a0
bsr.w SubVInt
addq #4,SP
tst.l d0
beq.b .freeres3 ; helaas
move.l a3,a1
move.l d0,a3
bsr.w FreeVInt
bra.b .lus
;=== r*a^b = r*(a*a)^(b/2)
.kwad move.l a2,a0
move.l a2,a1
bsr.w MulVInt
tst.l d0
beq.b .freeres3 ; helaas
move.l a2,a1
move.l d0,a2
bsr.w FreeVInt
move.l a3,a0
moveq #1,d0
bsr.w ShiftVIntR
move.l d0,a0
bsr.b ShrinkVInt
bra.b .lus
.klaar move.l a2,a1
bsr.w FreeVInt
move.l a3,a1
bsr.w FreeVInt
move.l a4,d0
.ex movem.l (SP)+,d2/d3/a2-a4
rts
.freeres3
move.l a2,a1
bsr.w FreeVInt
.freeres2
move.l a3,a1
bsr.w FreeVInt
.freeres
move.l a4,a1
bsr.w FreeVInt
moveq #0,d0
bra.b .ex
; in a0 = in te krimpen VInt
; uit d0 = ingekrompen VInt
ShrinkVInt
move.l a0,a1
moveq #0,d1
moveq #0,d0
move.w (a1)+,d1
.1 tst.w (a1)+
dbne d1,.1
bne.s Shrink
moveq #0,d1 ; lengte kleiner dan 0 kan niet
Shrink push.l a0
move.w (a0),d0 ; oude lengte
move.w d1,(a0) ; nieuwe lengte
sub.w d1,d0 ; verschil
beq.b .klaar
add.l d0,d0
lea 2(a0,d0.l),a1
addq.l #2,a0
.2 move.w (a1)+,(a0)+
dbf d1,.2
move.l a0,d1 ; a0 is einde van het getal
addq.l #7,d1 ; d1 = nieuwe einde +7
add.l d1,d0 ; d0 = oude einde +7
and.w #$fff8,d1
and.w #$fff8,d0 ; afronden (omhoog)
sub.l d1,d0
beq.b .klaar
bcc.b .3
neg.w d0
.3 move.l d1,a1
move.l 4.w,a6
Lib FreeMem
.klaar pop.l d0
rts
CutOff moveq #0,d0
subq #1,(a0)
move.w (a0),d0
add.l d0,d0
lea 4(a0,d0.l),a1
move.l a1,d0
and.w #7,d0
bne.s .klaar
moveq #8,d0
move.l 4.w,a6
LibJ FreeMem
.klaar rts
; in a0 = uit te breiden VInt
; uit d0 = nieuw VInt
ExtendVInt
moveq #0,d0
move.w (a0),d0
addq.l #2,d0
add.l d0,d0
and.w #7,d0
beq.s .new
move.l a0,a1
move.w (a1)+,d0
add.w d0,a1
add.w d0,a1
addq #4,a1
.2 move.w -4(a1),-(a1)
dbf d0,.2
move.w #1,-(a1)
addq.w #1,(a0)
move.l a0,d0
rts
.new move.l a0,-(SP)
move.w (a0),d0
addq #1,d0
beq.b .err ; sorry, tooooo long
bsr.b MaakVInt
tst.l d0
beq.b .err ; no mem
move.l (SP)+,a1
move.l d0,-(SP)
move.l a1,-(SP)
move.l d0,a0
move.w #1,2(a0)
moveq #0,d0
move.w (a1),d0
add.w #4,a0
add.w #2,a1
.1 move.w (a1)+,(a0)+
dbf d0,.1
move.l (SP)+,a1
bsr.b FreeVInt
move.l (SP)+,d0
rts
.err move.l (SP)+,a1
bsr.b FreeVInt
moveq #0,d0
rts
; in d0=woord
; uit d0=VInt
Word2VInt
move.w d0,-(SP)
moveq #0,d0
bsr.b MaakVInt
tst.l d0
beq.s .ex
move.l d0,a0
move.w (SP)+,2(a0)
.ex rts
; in d0=longwoord
; uit d0=VInt
Long2VInt
move.l d0,-(SP)
tst.w (SP)
beq.s .word
moveq #1,d0
bsr.b MaakVInt
tst.l d0
beq.s .ex
move.l d0,a0
move.l (SP)+,2(a0)
.ex rts
.word addq.l #4,SP
bra.s Word2VInt
; in d0=aantal woorden in VInt -1
; uit d0=VInt
MaakVInt
move.l 4.w,a6
moveq #0,d1
move.w d0,d1
addq.l #2,d1
add.l d1,d1
addq.l #7,d1
and.w #$fff8,d1
move.w d0,-(SP)
move.l d1,d0
move.l #MEMF_CLEAR!MEMF_PUBLIC,d1
Lib AllocMem
tst.l d0
beq.s .ex
move.l d0,a0
move.w (SP)+,(a0)
.ex rts
; in : a1 = VInt
FreeVInt
push.l a6
move.l 4.w,a6
moveq #0,d0
move.w (a1),d0
add.l d0,d0 ; words -> bytes
addq.l #4,d0 ; voor aantal woorden
addq.l #7,d0
and.w #$fff8,d0 ; afronden op 8 bytes
Lib FreeMem
pop.l a6
rts
; in : a0 = VInt
; uit : d0 = nieuwe VInt
CopyVInt
move.l 4.w,a6
;=== calc len
moveq #0,d1
move.w (a0),d1
push.l A0
addq.l #2,d1
add.l d1,d1
addq.l #7,d1
and.w #$fff8,d1
;=== Alloc.mem.
move.l d1,d0
moveq #MEMF_PUBLIC,d1
Lib AllocMem
tst.l d0
beq.s .err
move.l d0,a0
pop.l a1
;=== copy int
move.w (a1)+,d1
move.w d1,(a0)+
.1 move.w (a1)+,(a0)+
dbf d1,.1
rts
.err addq.l #4,SP
rts
tien dc.l 10
tien38 dc.w 7,$4b3b,$4ca8,$5a86,$c47a
dc.w $098a,$2240,$0000,$0000 ; tien tot de 38e
Memory moveq #1,d1
move.l 4.w,a6
Lib AvailMem
lea _Mem(PC),a0
push.l d0
move.l SP,a1
bsr.w print
addq.l #4,SP
rts
;===== zet getal in tekst om en vernietig het
PrintVInt38
lea Txt+TxtLen(a5),a2
push.l a0
moveq #18,d2
.lus moveq #100,d0
bsr.w DeelVInt
tst.l d0
beq.b .klaar ; error
divu #10,d1
or.l #$300030,d1
swap d1
move.b d1,-(a2)
swap d1
move.b d1,-(a2)
pop.l a1
push.l d0
bsr.w FreeVInt
move.l (SP),a0
dbf d2,.lus
move.l a0,a1
bsr.w FreeVInt
.klaar addq.l #4,SP
move.l a2,a0
moveq #38,d0
bra.w PrintVL
PrintVInt
cmp.w #8,(a0)
blo.w .rest
movem.l d2/a2/a3,-(SP)
lea tien38(PC),a1 ; begin-waarde voor deler
push.l a1
move.l SP,a3
moveq #0,d2
pea .einde(PC) ; afsluitroutine
move.l a0,a2 ; sla origineel op
.lusop moveq #0,d0
move.w (a1),d0 ; lengte van deler
add.l d0,d0 ; x2
addq.l #1,d0
cmp.w (a2),d0 ; vergelijken
bhs.b .1 ; nu gaan we het getal afbreken en afdrukken
move.l a1,a0
bsr.w MulVInt ; kwadrateer
push.l d0
beq.b .abort ; helaas
pea .freeVInt(PC) ; geef getal later nog terug
subq #8,d2 ; teller aanpassen
move.l d0,a1
bra.b .lusop ; volgende slag
.abort addq.l #4,SP
rts
.freeVInt
pop.l a1
bra.w FreeVInt
.einde addq.l #4,SP
movem.l (SP)+,d2/a2/a3
.ex rts
.1 move.l a2,a0
bsr.w DeelVIntsMod
push.l d1 ; zet modulo op de stack
beq.b .abort ; helaas
bra.s .11
.halv bsr.w DeelVIntsMod
tst.l d1
beq.b .ex ; helaas
addq.l #4,SP
pop.l a1 ; geef dit overbodige getal vrij
push.l d1 ; zet modulo op de stack
push.l d0 ; zet quotient op de stack
bsr.w FreeVInt ; geef getal vrij
pop.l d0
.11 tst.w d2
beq.b .prest
addq #8,d2
push.w d2
pea .recurp(PC)
push.l d0
pea .freeVInt(PC)
move.l d0,a0 ; quotient
.3 move.l (a3,d2.w),a1 ; deler
moveq #0,d0
move.w (a1),d0 ; deler-lengte
moveq #0,d1
move.w (A0),d1 ; quotient lengte
sub.l d1,d0 ; vergelijken
blo.b .halv ; klaar : quotient-lengte > deler-lengte
tst.w d2
beq.b .rest
addq #8,d2
bra.b .3 ; vergelijk de volgende
.prrest move.l d0,a0
bra.b .rest
.prest move.l d0,a0
push.l a0
bsr.b .rest
pop.l a1
bsr.w FreeVInt
pop.l a0
bra.w PrintVInt38
.recurp pop.w d2
pop.l a0
.4 push.l a0
pea .freeVInt(PC)
move.l (a3,d2.w),a1
bsr.w DeelVIntsMod
push.l d1 ; modulo
beq.w .abort
tst.w d2
beq.b .rec1
addq #8,d2
push.w d2
pea .recurp(PC)
move.l d0,a0
bra.b .4
.rec1 pea .printVast(PC)
move.l d0,a0
bra.w PrintVInt38
.rest push.l a2
lea Txt+TxtLen(a5),a2
moveq #10,d0
bsr.w DeelVInt
tst.l d0
beq.b .klaarSP
or.b #'0',d1
move.b d1,-(a2)
push.l d0
move.l d0,a0
.lus moveq #10,d0
tst.l (a0)
beq.b .klaar ;Noc
bsr.w DeelVInt
tst.l d0
beq.b .klaar ;noC
or.b #'0',d1
move.b d1,-(a2)
pop.l a1
push.l d0
bsr.w FreeVInt
move.l (SP),a0
bra.b .lus
.klaar pop.l a1
bsr.w FreeVInt
.klaarSP
move.l a2,a0
lea Txt+TxtLen(a5),a1
sub.l a2,a1
move.l a1,d0
bsr.b PrintVL
pop.l a2
rts
.printVast
pop.l a0
bra.w PrintVInt38
PrintTxt
movem.l d2/d3/a6,-(SP)
move.l DosBase(a5),a6
move.l a0,d2
move.l OutHD(a5),d1
.1 tst.b (a0)+
bne.b .1
move.l a0,d3
sub.l d2,d3
subq #1,d3
Lib Write
movem.l (SP)+,d2/d3/a6
rts
PrintVL movem.l d2/d3/a6,-(SP)
move.l DosBase(a5),a6
move.l OutHD(a5),d1
move.l a0,d2
move.l d0,d3
Lib Write
movem.l (SP)+,d2/d3/a6
rts
;========
;======== RawDoFmtTest
;========
; in : a0 = string
; a1 = argumenten
print movem.l d2/d3/a2/a3/a6,-(SP)
bsr.b Format
move.l OutHD(a5),d1
lea OutBuff(a5),a0
move.l a0,d2
.1 tst.b (a0)+
bne.s .1
move.l a0,d3
sub.l d2,d3
move.l DosBase(a5),a6
Lib Write
movem.l (SP)+,d2/d3/a2/a3/a6
rts
;====== Function that will use the string 'String' and makes an output
;====== in OutBuff in c-style
Format move.l 4.w,a6
lea Function(PC),a2 ; our store-function; this one could be used
; to maintain a buffer and print it when it is
; full. However our function just copies.
lea OutBuff(a5),a3 ; our outbuff
LibJ RawDoFmt ; RawDoFmt
; rts ; End of our program
;=== in : d0=byte to be printed
;=== a3=buffer
;=== out : a3=a3+1
Function
move.b d0,(a3)+
rts
KeyDecodeS
lea (a0,d1.w),a1 ; als het aantal geldige toetsen even
; is, kan de sprongtabel aan de hand
; hiervan worden berekend
;--------
;-------- A0 = pointer naar tabel met toetsen
;-------- A1 = pointer naar sprongtabel, met als laatste het terugsprongadres
;-------- D0 = actuele toets
;-------- D1 = aantal geldige toetsen
;--------
KeyDecode
cmp.b #'Z',d0
bhi.s .1
cmp.b #'A',d0
blo.s .1
or.b #$20,d0 ; kleine letters van maken
.1 addq #2,a1 ; volgende pointer
cmp.b (a0)+,d0 ; vergelijk of het de goede toets is
dbeq d1,.1 ; nee -> volgende tot aan terugsprong
.2 add.w -(a1),a1 ; offset ophalen
jmp (a1) ; sprong
DosNaam DOSNAME
incdir SourcesV:VintEval/
if nederlands
include Vint-Ned.teksten.S
else
include Vint-Eng.teksten.S
endif